from decimal import Decimal
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.forms.models import inlineformset_factory
from django.http import HttpRequest, HttpResponseRedirect
from django.shortcuts import render_to_response, redirect
from django.template.context import Context, RequestContext

from festivalrock.forms import EmitirTicketForm, FiltrarLocalidadesForm, \
    FiltrarFestivalesForm, Venta_FestivalesForm, Venta_DiasForm, Venta_SectoresForm, \
    Venta_EntradasForm, Planificacion_FestivalesForm, Planificacion_BandasForm
from festivalrock.models import Presentacion, Festival, Butaca, Descuento, \
    PuntoVenta, Fila, Sector, Noche, PerfilUsuario


@login_required
def get_usuario_logueado(request):
    username = None
    if request.user.is_authenticated():
        username = request.user.username
    return username
    
@login_required
def validar_usuario(request):
    usuario = PerfilUsuario.objects.get(nombre=get_usuario_logueado(request))
    
    if usuario.tipoUsuario == 'V':
        return HttpResponseRedirect('ventas/')
    else:
        return HttpResponseRedirect('funcionalidades/')
@login_required
def obtener_punto_venta(request):
    user = User.objects.get(username=get_usuario_logueado(request))
    puntoVenta = PuntoVenta.objects.get(usuario=user)
    return puntoVenta

@login_required
def funcionalidades(request):
    puntoVenta = obtener_punto_venta(request)
    return render_to_response('funcionalidades.html', {'puntoVenta' : puntoVenta}, context_instance=RequestContext(request))

@login_required
def planificacion(request):
    puntoVenta = obtener_punto_venta(request)
    
    if request.method == 'POST':
        # formulario enviado
        festivalesForm = Planificacion_FestivalesForm(puntoVenta.id, request.POST, instance=request.user)
        if festivalesForm.is_valid():
            print("Form valido!!")
            cd = festivalesForm.cleaned_data
        
    else:
        # formulario inicial
        festivalesForm = Planificacion_FestivalesForm(puntoVenta.id, request, instance=request.user)
    
    bandasForm = Planificacion_BandasForm(request, instance=request.user)
    
    context = Context({
        'puntoVenta'     : puntoVenta,
        'festivalesForm' : festivalesForm,
        'bandasForm'     : bandasForm,
    })
    
    return render_to_response('planificacion.html', context, context_instance=RequestContext(request))
    
@login_required
def festivales(request,id_festival=None,id_noche=None,id_sector=None):
    
    localidades = []
    sectores = [Sector(),]
    tablaEntradas = {}
 
    puntoVenta = obtener_punto_venta(request)

    if id_festival != None:
        festivalesForm = Venta_FestivalesForm(puntoVenta.id, request, instance=request.user)
        festivalesForm.setFestivalSeleccionado(id_festival)
        if id_noche != None:
            fechasForm = Venta_DiasForm(id_festival, request, instance=request.user)
            fechasForm.setNocheSeleccionada(id_noche)
            if id_sector != None:
                sectoresForm = Venta_SectoresForm(id_noche, request, instance=request.user)
                sectoresForm.setSectorSeleccionado(id_sector)
                if id_sector > '0':
                    sectores = Sector.objects.filter(id=id_sector)
                    localidades = Fila.objects.filter(sector=id_sector)
                    tablaEntradas = obtener_detalle_entrada_seleccionada(request,id_festival,id_noche,id_sector)
                    
    elif request.method == 'POST':
        # formulario enviado
        
        festivalesForm = Venta_FestivalesForm(puntoVenta.id, request, instance=request.user)
        
        id_festival = request.POST['festivales']
        fechasForm = Venta_DiasForm(id_festival, request, instance=request.user)
        
        id_noche = request.POST['noches']
        sectoresForm = Venta_SectoresForm(id_noche, request, instance=request.user)
                
        id_sector = request.POST['sectores']
        if id_sector > '0':
            sectores = Sector.objects.filter(id=id_sector)
            localidades = Fila.objects.filter(sector=id_sector)
        
        festivalesForm.setFestivalSeleccionado(id_festival)
        fechasForm.setNocheSeleccionada(id_noche)
        sectoresForm.setSectorSeleccionado(id_sector)
        
    else:
        # formulario inicial
        festivalesForm = Venta_FestivalesForm(puntoVenta.id, request, instance=request.user)
        fechasForm = Venta_DiasForm(0, request, instance=request.user)
        sectoresForm = Venta_SectoresForm(0, request, instance=request.user)
    
    context = Context({
        'puntoVenta'     : puntoVenta,
        'festivalesForm' : festivalesForm,
        'fechasForm'     : fechasForm,
        'sectoresForm'   : sectoresForm,
        'localidades'    : localidades,
        'sectores'       : sectores,
        'id_festival'    : id_festival,
        'id_noche'       : id_noche,
        'id_sector'      : id_sector,
        'tablaEntradas'  : tablaEntradas,
    })
        
    return render_to_response('ventas.html', context, context_instance=RequestContext(request))

@login_required
def seleccionar_localidad(request, id_butaca, id_fila, id_festival, id_noche, id_sector):
    butaca = Butaca.objects.get(id=id_butaca)
    user = User.objects.get(username=get_usuario_logueado(request))
    butaca.bloquear(user)
    return festivales(request, id_festival, id_noche, id_sector)

def obtener_detalle_entrada_seleccionada(request,id_festival,id_noche,id_sector):
    user = User.objects.get(username=get_usuario_logueado(request))
    butacas = Butaca.objects.filter(vendedor=user)
    results = []
    sector = Sector.objects.get(id=id_sector)
    noche = Noche.objects.get(id=id_noche)
    for butaca in butacas:
        fila = Fila.objects.get(butacas__id=butaca.id)
        results.append(DetalleEntrada(fila.getNumero(),butaca.getNumero(),sector.getImporteEntradaBase(),noche.getAdicionalPorCategoria()))
    return results 

class DetalleEntrada():
    def __init__(self,fila,butaca,importe,adicional):
        self.fila = fila
        self.butaca = butaca
        self.importe = importe
        self.adicional = adicional
        
@login_required
def cargar_planificacion(request):
    
    puntoVenta = obtener_punto_venta(request)
    
    if request.method == 'POST':
        # formulario enviado
        
        festivalesForm = Planificacion_FestivalesForm(puntoVenta.id, request, instance=request.user)
        festivalesForm.setFestivalSeleccionado(request)

        festival = request.POST['festivales']        
        fechasForm = Venta_DiasForm(festival, request, instance=request.user)
        fechasForm.setNocheSeleccionada(request)

        noche = request.POST['noches']
        
    else:
        # formulario inicial
        festivalesForm = Planificacion_FestivalesForm(puntoVenta.id, request, instance=request.user)
        fechasForm = Venta_DiasForm(0, request, instance=request.user)
        bandasForm = Planificacion_BandasForm(request, instance=request.user)
    
    context = Context({
        'puntoVenta'     : puntoVenta,
        'festivalesForm' : festivalesForm,
        'fechasForm'     : fechasForm,
        'bandasForm'     : bandasForm,
    })
        
    return render_to_response('ventas.html', context, context_instance=RequestContext(request))

@login_required
def presentaciones(request,id_festival):
    puntoVenta = obtener_punto_venta(request)
    context = Context({
        'puntoVenta' : puntoVenta,               
        'presentaciones': puntoVenta.getPresentacionesDelFestival(id_festival),
        'festival': Festival.objects.filter(id=id_festival),
    })
    return render_to_response('presentaciones.html', context, context_instance=RequestContext(request))

@login_required
def filtrar_localidades(request,id_presentacion):
    puntoVenta = obtener_punto_venta(request)
    if request.method == 'POST':
            form = FiltrarLocalidadesForm(request.POST)
            if form.is_valid():
                cd = form.cleaned_data
                id_sector = cd['sector']
                sectores = Sector.objects.filter(id=id_sector)
    else:
        sectores = Sector.objects.filter(presentacion__id=id_presentacion)
    form = FiltrarLocalidadesForm()
    context = Context({
        'puntoVenta' : puntoVenta,
        'festival': Festival.objects.get(id=1),
        'presentacion'  : Presentacion.objects.get(id=id_presentacion),
        'localidades'   : sectores,
        'fecha'         : sectores[0].presentacion.fecha,
        'bandas'        : sectores[0].obtenerBandas(),
        'form': form,
    })
    return render_to_response('localidades.html', context, context_instance=RequestContext(request))

@login_required
def desbloquear_butaca(request,id_butaca):
    butaca = Butaca.objects.get(id=id_butaca)
    butaca.desbloquear()
    return filtrar_localidades(request,butaca.getSector().presentacion.id)

@login_required
def adquirir_localidad(request):
    user = User.objects.get(username=get_usuario_logueado(request))
    butacas = Butaca.objects.filter(vendedor=user)
    puntoVenta = obtener_punto_venta(request)
#    butaca.bloquear()
#    resumenVenta = butaca.resumenVenta()
    if request.method == 'POST':
        form = EmitirTicketForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            id_descuento = cd['descuento']
            descuento=Descuento.objects.get(id=id_descuento)
#            ticket=butaca.adquirir(descuento,puntoVenta.vendedor)
            context = Context({
                'puntoVenta':puntoVenta,               
#                'festival': resumenVenta[0],
#                'fecha': resumenVenta[1],
#                'sector': resumenVenta[2],
#                'fila'  : Fila.objects.get(butacas__id=butaca.id),
#                'butaca': butaca,
#                'bandas': resumenVenta[3],
#                'ticket': ticket,
                'url'   : Site.objects.get(id=1).name + "/media/",
                'url_filtrar_sector' :Site.objects.get(id=1).name + "/localidades_por_sector",
            })
            return render_to_response('ticket.html', context, context_instance=RequestContext(request))
    else:
        form = EmitirTicketForm()
    context = Context({
        'puntoVenta' : puntoVenta,
#        'festival': resumenVenta[0],
#        'fecha': resumenVenta[1],
#        'sector': resumenVenta[2],
#        'fila'  : Fila.objects.get(butacas__id=butaca.id),
#        'butaca': butaca,
#        'bandas': resumenVenta[3],
#        'descuentoAnticipada' : resumenVenta[2].importeEntradaBase * Decimal(resumenVenta[4]),
        'form': form,
#        'urlCancelacion':Site.objects.get(id=1).name + "/desbloquear_butaca/"+ str(butaca.id) ,
    })
    return render_to_response('butaca.html', context, context_instance=RequestContext(request))
    